home *** CD-ROM | disk | FTP | other *** search
/ 10,000 Great Games / 10,000 Great Games.iso / Product / 66 / data1.cab / Source_Files / Src / Audible.cpp < prev    next >
C/C++ Source or Header  |  2000-01-16  |  2KB  |  124 lines

  1. #include "stdafx.h"
  2.  
  3. cAudible::cAudible(cProperties *_orig) 
  4.         : cAnimatable(_orig)
  5.     sequence = 0;
  6.     looped = FALSE;
  7.     voice = 0; 
  8. }
  9.  
  10. cAudible::~cAudible() 
  11.     stop_sound(); 
  12. }
  13.  
  14. int cAudible::current_sound_finished()
  15. {
  16.     if (voice == 0 || !sound_wait)
  17.         return TRUE;
  18.  
  19.     DWORD pos;
  20.  
  21.     voice->GetCurrentPosition(&pos, 0);
  22.     
  23.     return pos == 0;
  24. }
  25.  
  26. void cAudible::set_sound(cSound *sound)
  27. {
  28.     // Handle no sound case or if game is not running
  29.  
  30.     if (no_sound || sound == 0 || end_game)
  31.         return;
  32.     
  33.     // Allocate voice
  34.     
  35.     if (FAILED(DS->DuplicateSoundBuffer(sound->sample->dsb, &voice)))
  36.         error("Unable to allocate sound buffer duplicate");
  37.         
  38.     // Set other parameters
  39.     
  40.     voice->SetCurrentPosition(1);
  41.     voice->SetVolume(sound->volume);
  42.     voice->SetPan(-2000 + 4000 * x / surface->w);
  43.     voice->Play(0, 0, (sound->duration > 0 || sound->loop)? DSBPLAY_LOOPING:0);
  44.         
  45.     sound_wait = sound->duration > 0? sound->duration:MAXFIX;
  46. }
  47.  
  48. void cAudible::kill_sound()
  49. {
  50.     if (voice != 0)
  51.     {
  52.         voice->Stop();
  53.         voice->Release();    
  54.         voice = 0;
  55.     }
  56. }
  57.  
  58. void cAudible::add_sound_to_sequence(cSound *sound)
  59. {
  60.     if (sound_done() && y_on_screen())
  61.         set_sound(sound);
  62.     else
  63.         new cContainer<cSound> (&sequence, sound);
  64. }
  65.  
  66. void cAudible::add_soundsequence(cSoundSequence &seq, int _looped)
  67. {
  68.     cSound *i;
  69.     
  70.     looped = _looped && seq.start_sound != seq.end_sound;
  71.     looped_sound = seq;
  72.     
  73.     if (seq.start_sound == 0)
  74.         return;
  75.     
  76.     for (i = seq.start_sound; i != 0 && i != seq.end_sound; i = (cSound *)i->next)
  77.         add_sound_to_sequence(i);
  78.     
  79.     add_sound_to_sequence(i);
  80. }
  81.  
  82. void cAudible::add_soundsequence(char *seq, int looped)
  83. {
  84.     cSoundSequence s;
  85.     
  86.     orig->get_soundsequence(seq, s);
  87.     add_soundsequence(s, looped);
  88. }
  89.  
  90. int cAudible::control()
  91. {
  92.     // Animate images
  93.     
  94.     cAnimatable::control();
  95.  
  96.     // Do sounds
  97.     
  98.     if (!no_sound && (voice != 0 || sequence != 0) && current_sound_finished())
  99.     {
  100.         // Kill old sound
  101.         
  102.         kill_sound();
  103.         
  104.         // Is there more?
  105.         
  106.         if (sequence != 0 && y_on_screen())
  107.         {
  108.             // Next sound
  109.             
  110.             set_sound(sequence->contents);
  111.             delete(sequence);
  112.             
  113.             // Do looped animations
  114.             
  115.             if (sequence == 0 && looped)
  116.                 add_soundsequence(looped_sound, TRUE);
  117.         }
  118.     }
  119.  
  120.     return TRUE;
  121. }
  122.